import axios from 'axios';
import { MessageBox, Message } from 'element-ui';
import store from '@/store';
import { getToken } from '@/utils/auth';

// 创建axios实例
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // 基础接口路径（会与具体请求URL拼接）
  // withCredentials: true, // 跨域请求时携带cookie（默认禁用）
  timeout: 5000 // 请求超时时间（5秒）
});

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 在发送请求之前进行操作

    // 如果存在登录令牌(token)，携带在请求头中
    if (store.getters.token) {
      // 自定义请求头字段（根据实际需求修改'X-Token'字段）
      config.headers['X-Token'] = getToken();
    }
    return config;
  },
  error => {
    // 请求错误处理（一般发生在网络层）
    console.log(error); // 调试用
    return Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use(
  /**
   * 如果需要获取HTTP信息如响应头或状态码
   * 可以直接返回 response 对象：
   * response => response
   */

  /**
   * 通过自定义状态码判断请求状态
   * （此处是示例逻辑，实际应根据项目需求设计）
   * 也可以通过HTTP状态码判断
   */
  response => {
    const res = response.data;

    // 当自定义状态码不等于20000时，判定为错误
    if (res.code !== 20000) {
      Message({
        message: res.message || '请求异常', // 优先显示后端返回的错误信息
        type: 'error',
        duration: 5 * 1000 // 错误提示显示5秒
      });

      // 特殊状态码处理：
      // 50008: 非法令牌  50012: 其他客户端登录  50014: 令牌过期
      if ([50008, 50012, 50014].includes(res.code)) {
        // 重新登录提示（确认后清除令牌并刷新页面）
        MessageBox.confirm('登录状态已失效，您可以留在当前页面，或重新登录', '确认退出', {
          confirmButtonText: '重新登录',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          // 调用Vuex的resetToken action
          store.dispatch('user/resetToken').then(() => {
            location.reload(); // 刷新页面触发重新登录流程
          });
        });
      }
      return Promise.reject(new Error(res.message || '请求错误'));
    } else {
      // 正常返回数据（剥离axios响应结构，直接返回业务数据）
      return res;
    }
  },
  error => {
    console.log('请求异常:' + error); // 调试信息
    Message({
      message: error.message || '服务连接异常',
      type: 'error',
      duration: 5 * 1000
    });
    return Promise.reject(error);
  }
);

export default service;
